// 配置模块 - 处理解释器的各种配置参数
use std::time::Duration;

/// 执行模式
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ExecutionMode {
    /// 正常执行模式
    Normal,
    /// 调试模式（输出更多调试信息）
    Debug,
    /// 静默模式（最小输出）
    Quiet,
    /// 详细模式（输出详细执行信息）
    Verbose,
}

impl ExecutionMode {
    /// 检查是否为调试模式
    pub fn is_debug(&self) -> bool {
        matches!(self, ExecutionMode::Debug | ExecutionMode::Verbose)
    }
}

/// 输出格式
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum OutputFormat {
    /// 纯文本输出
    Plain,
    /// JSON格式输出
    Json,
    /// 带颜色的终端输出
    Colored,
}

/// 资源限制配置
#[derive(Debug, Clone)]
pub struct ResourceLimits {
    /// 最大执行时间（毫秒）
    pub max_execution_time: Option<Duration>,
    /// 最大内存使用量（字节）
    pub max_memory_usage: Option<usize>,
    /// 最大循环迭代次数
    pub max_loop_iterations: Option<u64>,
    /// 最大递归深度
    pub max_recursion_depth: Option<u32>,
    /// 最大数组长度
    #[allow(dead_code)]
    pub max_array_length: Option<usize>,
}

impl Default for ResourceLimits {
    fn default() -> Self {
        Self {
            max_execution_time: Some(Duration::from_secs(30)), // 默认30秒超时
            max_memory_usage: Some(100 * 1024 * 1024),         // 默认100MB
            max_loop_iterations: Some(1_000_000),              // 默认100万次循环
            max_recursion_depth: Some(10000),                  // 默认10000层递归，增加限制
            max_array_length: Some(10_000),                    // 默认数组最大长度1万
        }
    }
}

/// 解释器配置
#[derive(Debug, Clone)]
pub struct InterpreterConfig {
    /// 执行模式
    pub execution_mode: ExecutionMode,
    /// 输出格式
    pub output_format: OutputFormat,
    /// 资源限制
    pub resource_limits: ResourceLimits,
    /// 是否启用优化
    pub enable_optimizations: bool,
    /// 是否启用安全检查
    pub enable_safety_checks: bool,
    /// 是否显示执行统计信息
    pub show_statistics: bool,
    /// 是否启用模块缓存
    pub enable_module_cache: bool,
    /// 模块搜索路径
    #[allow(dead_code)]
    pub module_paths: Vec<String>,
    /// 编码设置
    pub encoding: String,
    /// 是否启用字符串插值
    pub enable_string_interpolation: bool,
}

impl Default for InterpreterConfig {
    fn default() -> Self {
        Self {
            execution_mode: ExecutionMode::Normal,
            output_format: OutputFormat::Plain,
            resource_limits: ResourceLimits::default(),
            enable_optimizations: true,
            enable_safety_checks: true,
            show_statistics: false,
            enable_module_cache: true,
            module_paths: vec!["examples".to_string()],
            encoding: "UTF-8".to_string(),
            enable_string_interpolation: true,
        }
    }
}

impl InterpreterConfig {
    /// 创建调试配置
    #[allow(dead_code)]
    pub fn debug_config() -> Self {
        Self {
            execution_mode: ExecutionMode::Debug,
            show_statistics: true,
            ..Default::default()
        }
    }

    /// 创建性能测试配置
    pub fn performance_config() -> Self {
        Self {
            execution_mode: ExecutionMode::Verbose,
            show_statistics: true,
            enable_optimizations: true,
            ..Default::default()
        }
    }

    /// 创建安全模式配置
    pub fn safe_mode_config() -> Self {
        Self {
            execution_mode: ExecutionMode::Normal,
            enable_safety_checks: true,
            resource_limits: ResourceLimits {
                max_execution_time: Some(Duration::from_secs(10)),
                max_memory_usage: Some(50 * 1024 * 1024),
                max_loop_iterations: Some(100_000),
                max_recursion_depth: Some(500),
                max_array_length: Some(1000),
            },
            ..Default::default()
        }
    }
}

/// 命令行参数解析结果
#[derive(Debug)]
pub struct CliArgs {
    /// 操作模式
    pub mode: OperationMode,
    /// 配置文件路径
    pub config_file: Option<String>,
    /// 解释器配置
    pub config: InterpreterConfig,
    /// 输入文件路径
    pub input_file: Option<String>,
    /// 额外的模块路径
    pub module_paths: Vec<String>,
}

/// 操作模式
#[derive(Debug, Clone, PartialEq)]
pub enum OperationMode {
    /// 运行文件
    Run,
    /// 交互式REPL模式
    Repl,
    /// 检查语法
    Check,
    /// 格式化代码
    Format,
    /// 显示帮助信息
    Help,
    /// 显示版本信息
    Version,
}

impl Default for CliArgs {
    fn default() -> Self {
        Self {
            mode: OperationMode::Help,
            config_file: None,
            config: InterpreterConfig::default(),
            input_file: None,
            module_paths: vec![],
        }
    }
}
